<?php

/**
 * @brief Klasa kontrolera users z modułu "admin"
 * 
 * Klasa umożliwia zarządzanie użytkownikami. Głównym powodem jej istnienia
 * jest chęć pominięcia zewnętrznych aplikacji (np. phpMyAdmin) w procesie 
 * wyznaczania nowych administratorów strony.
 */
class Admin_UsersController extends Zend_Controller_Action
{

    protected $_user = null; /*!< Pole na dane użytkownia uzyskiwane z Zend_Auth */
    
    /**
     * @brief Standardowa metoda, której wykonanie poprzedza działanie akcji.
     * 
     * Przekazywany jest do niej widok nagłówka, pobierane są
     * wiadomości z flashMessengera oraz sprawdzane jest czy
     * użytkownik jest  zalogowany i uprawniony do dostępu do
     * akcji kontrolera.  
     * 
     */
    public function preDispatch()
    {
        $this->view->render('index/_headbox.phtml');
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->view->messages = $this->_flashMessenger->getMessages();
        
        $auth = Zend_Auth::getInstance();
        if($auth->hasIdentity()){
            $this->_user = $auth->getIdentity();
        } else {
            $this->_helper->flashMessenger->addMessage("warning/Zaloguj się!");
            $this->_helper->redirector('login','auth','default');
        }
        
        $user = $auth->getIdentity();
        if($user->role != 'admin'){
            $this->_helper->flashMessenger->addMessage("warning/Nie masz wymaganych uprawnień!");
            $this->_helper->redirector('index','mymca','default'); 
        }
    }

    /**
     * @brief Akcja index
     * 
     * Wyświetla ekran z listą użytkowników. Lista użytkowników, może być 
     * filtrowana ze względu na rolę użytkownika. 
     * 
     */
    public function indexAction()
    {
        $request = $this->getRequest();
        $scope = $request->getParam('scope');
        $page = $request->getParam('page');
        
        $this->view->scope = 'użytkowników';
        
        if($scope == 'admins'){
            $query = "role = 'admin'";
            $this->view->scope = 'administratorów';
        } elseif ($scope == 'users') {
            $query = "role = 'user'";
        } else {
            $query = '1';
        }
        
        $mapper = new Application_Model_MarketEntityMapper();
        
        $paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($mapper->fetchAll($query)));
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage(20);     
        $this->view->users = $paginator;
        
    }

    /**
     * @brief Akcja edycji użytkownika.
     * 
     * Akcja umożliwia edycję danych użytkownika, poza hasłem i rolą. 
     * Ekran akcji jest rozszerzony w stosunku do innych stworzonych akcji 
     * tego typu. Służy również do wyświetlania szczegółowych danych o użytkowniku.
     * Dane formularza edycji są wstępnie uzupełniane zgodnie z wprowadzonymi
     * wcześniej informacjami.
     */
    public function editAction()
    {
        $request = $this->getRequest();
        $id = $request->getParam('id');
        
        $mapper = new Application_Model_MarketEntityMapper();
        $user = $mapper->find($id);
        //sprawdzanie czy użytkownik istnieje
        if(empty($user)) {
            $this->_helper->flashMessenger->addMessage('error/Nie istnie użytkownik o podanej nazwie!');
            $this->_helper->redirector('index', 'users','admin');
        }
        
        $this->view->user = $user;
        
        $form = new Application_Form_ChangeEntity();
        //uzupełnianie danych
        $data = array(
            'email' => $user->getEmail(),
            'name' => $user->getName(),
            'name2' => $user->getName2(),
            'surname' => $user->getSurname(),
            'address' => $user->getAddress(),
        );
        
        $form->populate($data);
        //zapis zmian
        if($user->getRole() != 'admin'){
            if($request->isPost()){
                if($form->isValid($request->getPost())){
                    $user->setOptions($form->getValues());
                    $mapper->save($user,TRUE);
                    $this->_helper->flashMessenger->addMessage('success/Zmieniono dane uzytkownika!');
                    $this->_helper->redirector('edit', 'users','admin',array('id'=>$user->getLogin()));
                }
            }
        }
        
        $this->view->form = $form;
        
    }
    
    /**
     * @brief Akcja umożliwiająca wypromowanie użytkownika na administratora.
     */
    public function promoteAction() 
    {
        $request = $this->getRequest();
        $id = $request->getParam('id');
        
        $mapper = new Application_Model_MarketEntityMapper();
        $user = $mapper->find($id);
        
        if(empty($user)) {
            $this->_helper->flashMessenger->addMessage('error/Nie istnie użytkownik o podanej nazwie!');
            $this->_helper->redirector('index', 'users','admin');
        }
        
        if($user->getRole()== 'admin'){
            $this->_helper->flashMessenger->addMessage('error/Podany użytkownik jest już administratorem!');
            $this->_helper->redirector('index', 'users','admin');
        }
        
        $user->setRole('admin');
        $mapper->save($user, TRUE);
        
        $this->_helper->flashMessenger->addMessage('success/Użytkownik '.$user->getLogin().' został awansowany na administratora!');
        $this->_helper->redirector('index', 'users','admin');
    }
    
    
    /**
     * @brief Metoda wyświetlająca stopkę strony, po zakończeniu akcji.
     */
    public function postDispatch()
    {
        $this->view->render('index/_footbox.phtml');
        
    }




}





